#include <iostream>
#include <memory>
#include <type_traits>
using namespace std;

class DoubleDeleter {
public:
  DoubleDeleter() { cout << "ddb" << endl; }
  void operator()(double *p) { cout << "delete double" << endl; }
};

class A {
  int a;

public:
  A() : a(0) {}
  void pt(int *) { cout << "pt" << endl; }
};

int main() {
  A a;
  //指针构造，必须有二参数
  unique_ptr<int, void (*)(int *)> p(
      new int(1), [](int *ptr) -> void { cout << "a" << endl; });
  //走非指针构造函数,且有默认构造函数，所以可以不用传二参数
  unique_ptr<double, DoubleDeleter> q(new double(1.3));
  // unique_ptr<double, void(A::*)(int*)> l(new double(1.44),&A::pt); //false
  // 成员函数指针不是一个双参数可以调用对象

  // lambda没有默认构造函数，所以只能走双参数构造函数
  auto lp = [](double *p) -> void {};
  unique_ptr<double, decltype(lp)> ts(new double(123.1), lp);
  cout << "lambda: " << std::is_default_constructible<decltype(lp)>::value
       << std::endl;
}
